package com.spark.util.example

import com.spark.util.client.DbPoolClient
import scalikejdbc._

/**
  * 官方文档
  * http://scalikejdbc.org/
  */
object JdbcExample {

  def main(args: Array[String]): Unit = {

    DbPoolClient.initHikariCP(
      "test",
      "com.mysql.jdbc.Driver",
      "jdbc:mysql://localhost:3306/test?useSSL=false",
      "root",
      "123456"
    )

    DbPoolClient.usingDB("test"){ db =>

      db.autoClose(false)

      // 非事务
      db autoCommit { implicit session =>
        SQL("drop table if exists members").execute.apply()
        SQL("create table members (id serial not null primary key,name varchar(64))").execute.apply()
        SQL("insert into members(id,name) values (1,'dufafei')").update.apply()
      }

      // 事务,如果在块中抛出异常，事务将自动执行回滚。
      db localTx { implicit session =>
        val list = List((2,"caonima"),(3,"nimabi"))
        list.foreach{ x=>
          SQL("insert into members(id,name) values (?,?)").bind(x._1,x._2).update.apply()
        }
      }

      // 查询
      db readOnly { implicit session =>
        // session.fetchSize(1000)//设置返回条数
        // SQL("select * from members").map(x=>x.string(2)).single().apply()
        // SQL("select * from members").map(x=>x.string(2)).list().apply()
        // SQL("select * from members").map(x=>x.string(2)).first().apply()
        // 驱动默认情况下（fetchSize=0）将无限制地获取返回的结果，这种情况会导致内存相关的问题
        // foreach函数允许你在iterations中进行一些有副作用的计算，这个函数在ResultSet含有大量的返回值情况下特别有用。
        SQL("select * from members").fetchSize(100).foreach( rs => println(rs.string(2)))
      }
    }
  }
}
